home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 147
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z
/
Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin
/
fdimg
/
oh!.2hd
/
OH!DEN_B.LZH
/
TOOLS
/
CDC
/
CDCSXSRC.LZH
/
LBSRC.LZH
/
SCROLL.HAS
< prev
next >
Wrap
Text File
|
1995-03-20
|
22KB
|
1,144 lines
*スクロール処理関数
.text
.include DOSCALL.MAC *標準の奴(XC)
.include SXCALL.MAC *FSX Ver2.01用(シャープコンパチ)
.include SXCALL.H
* .include YOU106.MAC *独自のマクロ定義ファイルです
.include YOU200.MAC *独自のマクロ定義ファイルです
.include HASMACRO.MAC *HASのマクロパッケージ
.include WORK.INC *ワークエリアの内容を定義するファイル
.include FLAG.INC *条件付アセンブル処理を定義するファイル
*T_Break macro
* ~T
* rts
*endm
ofs = -8
SCREGS reg d1-d7/a1-a5
.offset ofs
ds.l 2
ds.l 2
SCmode: ds.w 1 *コマンド
SCPtr: ds.l 1 *構造体アドレス
SCKey:
SCargc: ds.l 1 *要素数-1必ず
SCslct:
SCstrHdl: ds.l 1 *文字列へのハンドル(描画時)
SCnowx: ds.l 1 *THUMB描画時ローカル座標
SCpart:
SCwinPtr: ds.l 1 *ウィンドウ構造体アドレス(最初だけ)
SCfont: ds.w 1
SCfontline: ds.w 1
SCscrline: ds.w 1
SCyy: ds.w 1
SCx1: ds.w 1
SCchr: ds.w 1
SCchr2: ds.w 1
SCyline: ds.w 1
SCKeyPtr: ds.l 1
*INIT
*pea.l KeyPtr(a5)
*move.w yline,-(sp)
*move.w chr2,-(sp)
*move.w chr,-(sp)
*move.w x1,-(sp)
*move.w yy,-(sp)
*move.w scrline,-(sp)
*move.w fontline,-(sp)
*move.w font,-(sp)
*move.l winptr,-(sp)
*pea 0.w *LOCAL
*pea 0.w *STRHDL
*move.l argc,-(sp)
*pea.l STRCTptr(a5) **or pea 0.w
*move.w COMMAND,-(sp) 0=INIT 1=ALLDRAW 2=CTRLCHK
*
*lea 42(sp),sp
*
*ALLDRAW
*
*move.l local,-(sp)
*move.l STRHDL(a5),-(sp)
*move.l argc,-(sp)
*pea.l STRCTptr(a5)
*move.w #1,-(sp)
*jsr
*lea.l 18(sp),sp
*
*CTRLCHK
*
*move.l local,-(sp)
*move.l STRHDL(a5),-(sp)
*move.l argc,-(sp)
*pea.l STRCTptr(a5)
*move.w #1,-(sp)
*jsr
*lea.l 18(sp),sp
*
*END
*pea.l STRCTptr(a5)
*move.w #3,-(sp)
*jsr
*addq.l #6,sp
*
*KEY
*move.l evetRec_whom1(a5),-(sp)
*pea.l STRCTptr(a5)
*Move.w #4,-(sp)
*jsr
*lea.l 10(sp),sp
*CHKSELECT
*move.l now_mpt(a5),-(sp)
*move.l argc(a5),-(sp)
*pea.l STRCTptr(a5)
*Move.w #5,-(sp)
*jsr
*lea.l 14(sp),sp
.text
*-------------------------------------
ScrProc::
link a6,#ofs
movem.l SCREGS,-(sp)
moveq #0,d0
move.l SCPtr(a6),a4 *スクロールシステム用構造体のアドレス
move.w SCmode(a6),d0 *コマンドナンバー
moveq #5,d1 *コマンドの上限
cmp.w d1,d0
bhi Break
add.l d0,d0
move.w jmptbl(pc,d0.l),d1
jmp jmptbl(pc,d1.w)
jmptbl:
dc.w initctrl-jmptbl *コントロール初期化
dc.w drawall-jmptbl *全部描画するルーチン
dc.w SCBarChk-jmptbl *ボタンが押された時
dc.w endctrl-jmptbl *終了処理 とりあえずなしね
dc.w keyCtrl-jmptbl
dc.w ChkSlct-jmptbl
dc.w Break-jmptbl
dc.w Break-jmptbl
dc.w Break-jmptbl
Break:
moveq #0,d0
Break2:
movem.l (sp)+,SCREGS
unlk a6
rts
*-------------------------------------
initctrl:
ifeq <cmpa.l #0,a4>
move.l #SCSIZE,-(sp) *カレントヒープに構造体確保
SX __MMChPtrNew,4
ifeq <move.l d0,a4>
moveq #-1,d0
bra Break2 *できなければエラー
else
move.l a4,a1
for d1,<move.l #SCSIZE,d1>
move.b #0,(a1)+
next
move.w #-1,tmpFlg1(a4)
endif
endif
move.l #30,WaitCount(a4) *デフォルトのウェイトカウント(後で変更可能)
move.w SCfont(a6),Sfont(a4)
move.w SCx1(a6),x1(a4)
move.w SCyy(a6),yy(a4)
move.w SCchr(a6),chr(a4)
move.w SCchr2(a6),chr2(a4)
move.w SCyline(a6),yline(a4)
move.l SCwinPtr(a6),cwinPtr(a4)
move.l #0,cTTL(a4) *ダミー
move.l SCstrHdl(a6),StrHdl(a4) *文字列リスト(固定長)へのハンドル
move.l SCargc(a6),UsrArgc(a4) *要素数-1
move.w SCfontline(a6),fontline(a4)
move.w SCscrline(a6),scrline(a4)
move.l SCKeyPtr(a6),KeyPtr(a4)
*x2=chr*Sfont/2
moveq #0,d0
move.l d0,d1
move.w Sfont(a4),d0
lsr.w #1,d0
move.w chr(a4),d1
mulu d1,d0
move.w d0,x2(a4)
*lim=fontline*yline
moveq #0,d0
move.l d0,d1
move.w fontline(a4),d0
move.w yline(a4),d1
mulu d1,d0
move.w d0,lim(a4)
*cLOC
move.w x1(a4),d0
add.w x2(a4),d0
addq.w #4,d0
move.w d0,cLOC(a4)
add.w #17,d0
move.w d0,cLOC+4(a4)
move.w yy(a4),d0
subq.w #4,d0
move.w d0,cLOC+2(a4)
moveq #0,d0
move.w yy(a4),d0
addq.w #4,d0
add.w lim(a4),d0
move.w d0,cLOC+6(a4)
*SCRect x1,yy,x1+x2,lim+yy
*Scr_pt
move.w x1(a4),SCRect(a4)
move.w yy(a4),SCRect+2(a4)
moveq #0,d0
move.w x1(a4),d0
move.w d0,Scr_pt(a4)
add.w x2(a4),d0
move.w d0,SCRect+4(a4)
moveq #0,d0
move.w yy(a4),d0
move.w d0,Scr_pt+2(a4)
add.w lim(a4),d0
move.w d0,SCRect+6(a4)
*limit_pt=lim-fontline
moveq #0,d0
moveq #0,d1
move.w fontline(a4),d1
* mulu.w scrline(a4),d1 *ここ
move.w lim(a4),d0
sub.w d1,d0
move.w d0,limit_pt(a4)
*limit_pt2=lim
move.w #0,limit_pt2(a4)
move.w lim(a4),limit_pt2+2(a4)
*limit_pt3=fontline*scrline
moveq #0,d0
move.w fontline(a4),d0
mulu scrline(a4),d0
move.l d0,limit_pt3(a4)
*lim_ofs=(lim/fontline)-1
move.w lim(a4),d0
move.w fontline(a4),d1
divu d1,d0
subq.w #1,d0
move.w d0,lim_ofs(a4)
*yline1
move.w yline(a4),d0
subq.w #1,d0
move.w d0,yline1(a4)
moveq #0,d0
move.l d0,-(sp)
move.w #67*16,-(sp)
move.w d0,-(sp)
move.w d0,-(sp)
move.w d0,-(sp)
move.w #TRUE,-(sp)
pea.l cTTL(a4)
pea.l cLOC(a4)
move.l cwinPtr(a4),-(sp)
SX __CMOpen,26
move.l d0,d0
move.l a0,cHDL(a4)
bsr SetSCBar
move.l cHDL(a4),d0 *一応コントロールハンドル返す
move.l a4,a0 *構造体のアドレス返す
bra Break2
*-------------------------------------
SetSCBar:
movem.l d1-d3,-(sp)
moveq #0,d0
move.l d0,d2
move.l d0,d3
move.l UsrArgc(a4),d2
mulu.w fontline(a4),d2
move.l d2,d1 *d2=def
iflt <sub.w limit_pt(a4),d1>
move.w #0,d3
else
move.w d1,d3 *max
endif
move.w SCDisp(a4),d1 *val
ifne <cmp.w nowSCmax(a4),d3> *max
bra @f
elseifne <cmp.w nowSCval(a4),d1> *val
bra @f
elseifne <cmp.w nowSCdef(a4),d2> *def
bra @f
else
bra SSCB_end
endif
@@:
move.w d3,-(sp)
move.l cHDL(a4),-(sp)
SX __CMMaxSet,6
move.w d1,-(sp)
move.l cHDL(a4),-(sp)
SX __CMValueSet,6
move.w d2,-(sp)
move.w #1,-(sp)
move.l cHDL(a4),-(sp)
SX __CMDefDataSet,8
move.w d2,nowSCdef(a4)
move.w d3,nowSCmax(a4)
move.w d1,nowSCval(a4)
SSCB_end:
movem.l (sp)+,d1-d3
rts
*==============================================*
*コマンド2(コントロール操作時の処理)
*==============================================*
SCBarChk:
move.l SCnowx(a6),local_xy(a4)
SX __EMSysTime,0
move.l d0,Timer(a4) *Timer処理のため現在時間取得
moveq #0,d3
move.l d3,d4
move.w SCDisp(a4),d4
move.w SCpart(a6),d1
****サムの処理****
ifeq <cmpi.w #C_INTHUMB,d1> *サムか
move.l #0,-(sp) *pea.l 0.w
move.l local_xy(a4),-(sp)
move.l cHDL(a4),-(sp)
SX __CMCheck,12 *マウスボタンが離されるまで追跡
move.l cHDL(a4),-(sp)
SX __CMValueGet,4 *スクロールバーの値読みだし
move.w d0,d4
divu.w fontline(a4),d4 *端数を切る
mulu.w fontline(a4),d4 *フォントラインで切る
move.w d4,-(sp)
bsr DoScroll *スクロール処理
addq.w #2,sp
*****アップダウンの処理******
elseifeq <cmpi.w #C_INUP,d1> *スクロールアップボタンか?
moveq #-1,d3
move.l limit_pt3(a4),d0
bsr SCBC_subN
elseifeq <cmpi.w #C_INPGUP,d1> *ページアップか
moveq #-1,d3
move.l limit_pt2(a4),d0
bsr SCBC_sub
moveq #0,d0
elseifeq <cmpi.w #C_INPGDOWN,d1>
move.l limit_pt2(a4),d0 *ページスクロールの増分
bsr SCBC_sub
moveq #0,d0
elseifeq <cmpi.w #C_INDOWN,d1>
move.l limit_pt3(a4),d0 *1行スクロールの増分
bsr SCBC_subN
endif
SCBC_end2:
bra Break2
*==============================================*
*値が最小値最大値を越えないようにして
*スクロール処理させる(do scroll)
*==============================================*
SCBC_sub:
ifne <tst.w d3>
sub.w d0,d4 *UP方向
else
add.w d0,d4 *DOWN方向
endif
iflt <cmpi.w #0,d4>
moveq #0,d0
move.w d0,d4
else
move.l cHDL(a4),-(sp)
SX __CMMaxGet,4
iflt <cmp.w d4,d0>
move.w d0,d4
endif
endif
move.w d4,-(sp)
bsr DoScroll
addq.w #2,sp
rts
*==============================================*
*ボタンの処理
*==============================================*
SCBC_subN:
ifne <tst.w d3>
sub.w d0,d4 *UP方向
else
add.w d0,d4 *DOWN方向
endif
iflt <tst.w d4> *最大最小越えない範囲に補正
moveq #0,d0
rts
* move.w d0,d4
else
move.l cHDL(a4),-(sp)
SX __CMMaxGet,4
iflt <cmp.w d4,d0>
* move.w d0,d4
rts
endif
endif
move.w d3,-(sp)
move.w d4,-(sp) *(元の値-CTRLVAL現在値
bsr DoScrollN
addq.w #4,sp
move.l cHDL(a4),-(sp)
SX __CMValueGet,0
move.w d0,d1
SX __CMMaxGet,4
ifeq <tst.w d1>
rts
elseifeq <cmp.w d0,d1>
rts
endif
SX __EMLStill,0
ifeq <tst.l d0>
rts
endif
@@:
bsr WaitPloc *最初の1動作はウェイト
tst.l d0
beq @b
SX __EMLStill,0
ifeq <tst.l d0>
rts
endif
@@:
move.l limit_pt3(a4),d0
bsr ~~A
move.l cHDL(a4),-(sp)
SX __CMValueGet,0
move.w d0,d1
SX __CMMaxGet,4
ifeq <tst.w d1>
rts
elseifeq <cmp.w d0,d1>
rts
endif
SX __EMLStill,0
ifeq <tst.l d0>
rts
endif
bra @b
*==============================================*
~~A:
ifne <tst.w d3>
sub.w d0,d4 *UP方向
else
add.w d0,d4 *DOWN方向
endif
iflt <tst.w d4> *最大最小越えない範囲に補正
moveq #0,d0
move.w d0,d4
else
move.l cHDL(a4),-(sp)
SX __CMMaxGet,4
iflt <cmp.w d4,d0>
move.w d0,d4
endif
endif
move.w d3,-(sp)
move.w d4,-(sp)
bsr DoScrollN
addq.w #4,sp
rts
*==============================================*
ofs = -16
.offset ofs
DSNTmpRect: ds.l 2
DSNTmpRgn: ds.l 1
DSN1 ds.l 1
ds.l 2
REGD4 ds.w 1
PLUMI ds.w 1
.text
DoScrollN:
link a6,#ofs
movem.l d1-d7/a1-a2,-(sp)
moveq #0,d0
move.w SCDisp(a4),d0
sub.w REGD4(a6),d0
move.l d0,DSN1(a6) *DS1=スクロールオフセット
SX __GMNewRgn,0
move.l a0,DSNTmpRgn(a6) *スクロールの際戻ってくるリージョンを確保
move.l DSNTmpRgn(a6),-(sp)
move.l DSN1(a6),-(sp)
pea.l SCRect(a4)
SX __GMScroll,12 *スクロール
movea.l cwinPtr(a4),a0
adda.l #$50,a0
move.l DSN1(a6),-(sp)
move.l (a0),-(sp)
SX __GMSlideRgn,8 *アップデートリージョンを操作
ifeq <tst.w PLUMI(a6)> *スクロール方向のフラグチェック
move.l SCRect(a4),d3
add.w limit_pt(a4),d3
add.w fontline(a4),d3
move.w fontline(a4),d4
mulu scrline(a4),d4 *
sub.w d4,d3
move.l d3,DSNTmpRect(a6)
move.w fontline(a4),d4
mulu scrline(a4),d4 *
add.w d4,d3
swap d3
add.w x2(a4),d3
swap d3
move.l d3,DSNTmpRect+4(a6)
else
move.l SCRect(a4),d3
move.l d3,DSNTmpRect(a6)
move.w fontline(a4),d4
mulu scrline(a4),d4 *
add.w d4,d3
swap d3
add.w x2(a4),d3
swap d3
move.l d3,DSNTmpRect+4(a6)
endif
pea.l DSNTmpRect(a6)
move.l DSNTmpRgn(a6),-(sp)
move.l DSNTmpRgn(a6),-(sp) *直書きする文字のところの
SX __GMXorRectRgn,12 *リージョンをUPDATE用貯蔵分から削る
move.l #$0,-(sp)
SX __GMLocalToGlobal,4
move.l d0,-(sp)
move.l DSNTmpRgn(a6),-(sp)
SX __GMSlideRgn,8 UPDATE すべきREGIONをグローバル座標に直す
move.l DSNTmpRgn(a6),-(sp)
SX __WMAddRgn,4 *アップデートリージョンに追加
move.l DSNTmpRgn(a6),-(sp)
SX __GMDisposeRgn,4 *テンポラリ用のリージョンを捨てる
move.w 8(a6),SCDisp(a4)
bsr SetSCBar *コントロールの値を更新する
move.l cHDL(a4),-(sp)
SX __CMValueGet,4 *スクロールバーの値取得
move.l d0,d1
divu.w fontline(a4),d1
moveq #0,d6
move.w d1,d6 ***
mulu chr2(a4),d1 *加工
move.l StrHdl(a4),-(sp)
SX __MMHdlLock,4
ifeq <tst.w PLUMI(a6)> *下の段
moveq #0,d7
move.w yline(a4),d7
subq.w #1,d7
add.w d7,d6 ***
mulu chr2(a4),d7
move.l SCRect(a4),d3 *X
add.w limit_pt(a4),d3 *Y
move.l d3,-(sp)
SX __GMMove,4
move.l StrHdl(a4),a1 *NameList=画像項目のリスト(HDL)
move.l (a1),a1 *先頭
adda.l d1,a1
adda.l d7,a1
move.w scrline(a4),d2
subq.w #1,d2
for d2,<>
ifne <tst.w tmpFlg4(a4)>
ifne <cmp.w tmpFlg2(a4),d6>
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
else
move.w #G_LGRAY,-(sp)
SX __GMForeColor,2
move.w #G_BLACK,-(sp)
SX __GMBackColor,2
endif
endif
pea.l (a1)
SX __GMDrawStrZ,4 *FILENAME表示
sub.w fontline(a4),d3 *Y
move.l d3,-(sp)
SX __GMMove,4
suba.w chr2(a4),a1
subq.l #1,d6
next
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
else *上の段
move.l Scr_pt(a4),d3
move.l d3,-(sp)
SX __GMMove,4
move.w scrline(a4),d2
subq.w #1,d2
move.l StrHdl(a4),a1 *NameList
move.l (a1),a1 *先頭
adda.l d1,a1
for d2,<>
ifne <tst.w tmpFlg4(a4)>
ifne <cmp.w tmpFlg2(a4),d6>
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
else
move.w #G_LGRAY,-(sp)
SX __GMForeColor,2
move.w #G_BLACK,-(sp)
SX __GMBackColor,2
endif
endif
pea.l (a1)
SX __GMDrawStrZ,4 *FILENAME表示
add.w fontline(a4),d3 *Y
move.l d3,-(sp)
SX __GMMove,4
adda.w chr2(a4),a1
addq.l #1,d6
next
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
endif
move.l StrHdl(a4),-(sp)
SX __MMHdlUnlock,4
movem.l (sp)+,d1-d7/a1-a2
unlk a6
rts
DSN_err:
movem.l (sp)+,d1-d7/a1-a2
unlk a6
~F
rts
*==============================================*
*==============================================*
ofs = -28
.offset ofs
DSTmpRgn: ds.l 1
DSupdRgn: ds.l 1
DStmpRect: ds.w 4
DStmp2Rect: ds.w 4
DS1: ds.l 1
ds.l 2
.text
DoScroll:
link a6,#ofs
moveq #0,d0
move.w SCDisp(a4),d0
sub.w 8(a6),d0
move.l d0,DS1(a6) *DS1=スクロールオフセット
move.l SCRect(a4),DStmp2Rect(a6)
move.l SCRect+4(a4),DStmp2Rect+4(a6)
move.l d0,-(sp)
pea.l DStmp2Rect(a6)
SX __GMSlideRect,8 *レクタングルをずらす
pea.l DStmp2Rect(a6)
pea.l SCRect(a4)
pea.l DStmpRect(a6) *テンポラリ
SX __GMAndRect,12 *重なる部分があるかチェック
ifne <move.l d0,d0> *重なる部分があった時の処理
SX __GMNewRgn,0
move.l a0,DSTmpRgn(a6)
move.l DSTmpRgn(a6),-(sp)
move.l DS1(a6),-(sp)
pea.l SCRect(a4)
SX __GMScroll,12 *スクロール
move.l #$0,-(sp)
SX __GMLocalToGlobal,4
move.l d0,-(sp)
move.l DSTmpRgn(a6),-(sp)
SX __GMSlideRgn,8 *アップデートリージョンをグローバル座標に直す
move.l DSTmpRgn(a6),-(sp)
SX __WMAddRgn,4 *アップデートリージョンに追加
move.l DSTmpRgn(a6),-(sp)
SX __GMDisposeRgn,4
else *重なる部分がない時の処理
move.l SCRect(a4),DStmp2Rect(a6)
move.l SCRect+4(a4),DStmp2Rect+4(a6)
move.l #$0,-(sp)
SX __GMLocalToGlobal,4
move.l d0,-(sp)
pea.l DStmp2Rect(a6)
SX __GMSlideRect,8
pea.l DStmp2Rect(a6)
SX __WMAddRect,4 *アップデートに任せる
endif
move.w 8(a6),SCDisp(a4)
bsr SetSCBar *コントロールの値を更新する
unlk a6
rts
*==============================================*
drawall:
move.l SCstrHdl(a6),StrHdl(a4) *文字列リスト(固定長)へのハンドル
move.l SCargc(a6),UsrArgc(a4) *要素数-1
bsr drawproc
bra Break
*xdef drawploc
drawproc:
movem.l d1-d5/a1,-(sp)
SETPORT2 cwinPtr(a4)
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
move.w #$100,-(sp)
SX __GMPenMode,2
move.w d0,-(sp)
pea.l SCRect(a4)
SX __GMFillRect,4
SX __GMPenMode,2
move.l cHDL(a4),-(sp)
SX __CMValueGet,4 *スクロールバーの値取得
move.l d0,d1
divu.w fontline(a4),d1 *1行増分で割るどのポイントから描くか
move.w d1,d5
mulu chr2(a4),d1 *加工(参照するメモリの固まりが1FILEで54BYTE)
move.l Scr_pt(a4),d3 *スクロール開始の左上座標
move.l d3,-(sp)
SX __GMMove,4
move.l StrHdl(a4),-(sp)
SX __MMHdlLock,4
move.l StrHdl(a4),a1 *NameList=画像項目のリスト(HDL)
move.l (a1),a1 *先頭
adda.w d1,a1
move.l UsrArgc(a4),d2 *UsrArgc=FILE数-1
cmp.l #-1,d2
beq @f
ifcc <cmp.w yline1(a4),d2> *yline1=Y方向の表示可能最大数-1
move.w yline1(a4),d2
endif
moveq.l #0,d4
move.w d5,d4
for d2,<>
ifne <tst.w tmpFlg4(a4)>
ifne <cmp.w tmpFlg2(a4),d4>
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
else
move.w #G_LGRAY,-(sp)
SX __GMForeColor,2
move.w #G_BLACK,-(sp)
SX __GMBackColor,2
endif
endif
pea.l (a1)
SX __GMDrawStrZ,4 *FILENAME表示
add.w fontline(a4),d3
move.l d3,-(sp)
SX __GMMove,4
adda.w chr2(a4),a1 *次の項目の先頭
addq.l #1,d4
next
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
@@:
move.l StrHdl(a4),-(sp)
SX __MMHdlUnlock,4
bsr SetSCBar
movem.l (sp)+,d1-d5/a1
rts
*==============================================*
*スクロールバー廃棄
*==============================================*
endctrl:
move.l cHDL(a4),-(sp)
SX __CMDispose,4
ifne <tst.w tmpFlg1(a4)>
pea.l (a4)
SX __MMPtrDispose,4
endif
bra Break
*===============================================*
*ウェイトをいれるための関数
*===============================================*
WaitPloc:
move.l d1,-(sp)
SX __EMSysTime,0 *システム時間の取得
move.l d0,d1
sub.l Timer(a4),d0 *カウントダウンして、時間きたかをd0に返す
ifcs <cmp.l WaitCount(a4),d0> *リピート間隔
moveq #0,d0 *まだ時間きてない
move.l (sp)+,d1
rts
else
move.l d1,Timer(a4)
moveq #-1,d0 *きちゃった
move.l (sp)+,d1
rts
endif
*===============================================*
KCREGS reg d1-d3/a1
keyCtrl:
movem.l KCREGS,-(sp)
ifeq <tst.l KeyPtr(a4)> *キーの定義がない時
movem.l (sp)+,KCREGS
bra Break
else
move.l KeyPtr(a4),a1
move.w SCDisp(a4),d2
move.l SCKey(a6),d3
ifeq <cmp.l (a1),d3>
moveq #0,d1
move.l limit_pt3(a4),d0 *1行スクロールUPの増分
bsr KCsub1
movem.l (sp)+,KCREGS
bra Break
elseifeq <cmp.l 4(a1),d3>
moveq #-1,d1
move.l limit_pt3(a4),d0 *1行スクロールDOWNの増分
bsr KCsub1
movem.l (sp)+,KCREGS
bra Break
elseifeq <cmp.l 8(a1),d3>
moveq #0,d1
move.l limit_pt2(a4),d0 *ページスクロールUP
bsr KCsub2
movem.l (sp)+,KCREGS
bra Break
elseifeq <cmp.l 12(a1),d3>
moveq #-1,d1
move.l limit_pt2(a4),d0 *ページスクロールDOWN
bsr KCsub2
movem.l (sp)+,KCREGS
bra Break
else
movem.l (sp)+,KCREGS
bra Break
endif
endif
KCsub1:
ifne <tst.w d1>
sub.w d0,d2 *UP方向
else
add.w d0,d2 *DOWN方向
endif
iflt <tst.w d2> *最大最小越えない範囲に補正
moveq #0,d0
moveq #0,d2
rts
else
move.l cHDL(a4),-(sp)
SX __CMMaxGet,4
iflt <cmp.w d2,d0>
rts
endif
endif
move.w d1,-(sp)
move.w d2,-(sp) *(元の値-CTRLVAL現在値
bsr DoScrollN
addq.w #4,sp
rts
KCsub2:
ifne <tst.w d1>
sub.w d0,d2 *UP方向
else
add.w d0,d2 *DOWN方向
endif
iflt <tst.w d2> *最大最小越えない範囲に補正
moveq #0,d0
moveq #0,d2
* rts
else
move.l cHDL(a4),-(sp)
SX __CMMaxGet,4
iflt <cmp.w d2,d0>
* rts
move.w d0,d2
endif
endif
move.w d1,-(sp)
move.w d2,-(sp) *(元の値-CTRLVAL現在値
bsr DoScroll
addq.w #4,sp
rts
*===============================================*
ChkSlct: *a4=SCptr
*SCslct(a6).l=now_mpt
move.l SCargc(a6),UsrArgc(a4) *要素数-1
move.l SCslct(a6),-(sp)
pea.l SCRect(a4)
SX __GMPtInRect,8 *名前の枠の中でクリックされたか
ifne <move.l d0,d0> *ならば
move.w SCslct+2(a6),d1 *mspos_y
sub.w yy(a4),d1 *
divu.w fontline(a4),d1 *これで、表示中のうち何番目かを知る
move.l cHDL(a4),-(sp)
SX __CMValueGet,4
divu.w fontline(a4),d0
add.w d1,d0 *これで何番目かわかる
move.l d0,d7
cmp.w SCargc+2(a6),d0
bhi CSt_end1
move.w tmpFlg2(a4),tmpFlg3(a4) *前のやつ
move.w d0,tmpFlg2(a4)
ifne <cmp.w tmpFlg3(a4),d0>
bsr drawproc2
move.w #-1,tmpFlg4(a4)
elseifeq <tst.w tmpFlg4(a4)>
bsr drawproc2
move.w #-1,tmpFlg4(a4)
endif
move.l d7,d0 *何番目かを返す
swap d0
move.w d1,d0 *表示中の位置も返す
swap d0
CSt_end:
bra Break2
endif
CSt_end1:
~F
bra Break2
*===============================================*
drawproc2:
link a6,#-8
movem.l d1-d6/a1,-(sp)
move.l d0,d2 *d0=LIST番号
mulu chr2(a4),d2 *d1=LIST先頭からのオフセット
* move.w #G_FORE*$100+G_PSET,-(sp)
* SX __GMPenMode,2
SETPORT2 cwinPtr(a4)
move.l StrHdl(a4),-(sp)
SX __MMHdlLock,4
moveq #0,d4
move.w tmpFlg3(a4),d4 *d4=LIST番号
move.l cHDL(a4),-(sp)
SX __CMValueGet,4 *スクロールバーの値取得
move.l d0,d5
divu.w fontline(a4),d5 *1行増分で割るどのポイントから描くか
move.w d5,d6
ifhi <cmp.w d4,d5>
bra @f
endif
add.w yline1(a4),d6
ifhi <cmp.w d6,d4>
bra @f
endif
sub.w d5,d4 *PT
moveq #0,d6
move.w tmpFlg3(a4),d6
mulu chr2(a4),d6 *offset
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
move.l Scr_pt(a4),d3 *スクロール開始の左上座標
mulu.w fontline(a4),d4
add.w d4,d3
move.l d3,-(sp)
SX __GMMove,4
move.l d3,-8(a6)
add.w fontline(a4),d3
swap d3
add.w x2(a4),d3
swap d3
move.l d3,-4(a6)
move.w #G_BACK*$100+G_PSET,-(sp)
SX __GMPenMode,2
pea.l -8(a6)
SX __GMFillRect,4
move.l StrHdl(a4),a1 *NameList=リスト(HDL:疑似可)
move.l (a1),a1 *先頭
adda.w d6,a1
pea.l (a1)
SX __GMDrawStrZ,4 *FILENAME表示
@@:
move.w #G_LGRAY,-(sp)
SX __GMForeColor,2
move.w #G_BLACK,-(sp)
SX __GMBackColor,2
move.l Scr_pt(a4),d3 *スクロール開始の左上座標
mulu.w fontline(a4),d1
add.w d1,d3
move.l d3,-(sp)
SX __GMMove,4
move.l d3,-8(a6)
add.w fontline(a4),d3
swap d3
add.w x2(a4),d3
swap d3
move.l d3,-4(a6)
move.w #G_FORE*$100+G_PSET,-(sp)
SX __GMPenMode,2
pea.l -8(a6)
SX __GMFillRect,4
move.l StrHdl(a4),a1 *NameList=リスト(HDL:疑似可)
move.l (a1),a1 *先頭
adda.w d2,a1
pea.l (a1)
SX __GMDrawStrZ,4 *FILENAME表示
move.w #G_BLACK,-(sp)
SX __GMForeColor,2
move.w #G_LGRAY,-(sp)
SX __GMBackColor,2
move.l StrHdl(a4),-(sp)
SX __MMHdlUnlock,4
bsr SetSCBar
movem.l (sp)+,d1-d6/a1
unlk a6
rts